package cn.wolfcode.crm.service.impl;

import cn.wolfcode.crm.domain.Employee;
import cn.wolfcode.crm.domain.Menu;
import cn.wolfcode.crm.mapper.MenuMapper;
import cn.wolfcode.crm.query.QueryObject;
import cn.wolfcode.crm.service.IMenuService;
import cn.wolfcode.crm.util.PageResult;
import cn.wolfcode.crm.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

@Service
public class MenuServiceImpl implements IMenuService {

    @Autowired
    private MenuMapper menuMapper;

    //保存和更新员工操作
    public int saveOrUpdate(Menu record) {
        if (record.getId() == null) {
            return menuMapper.insert(record);
        } else {
            return menuMapper.updateByPrimaryKey(record);
        }
    }

    //查询单个员工操作
    public Menu selectByPrimaryKey(Long id) {
        return menuMapper.selectByPrimaryKey(id);
    }


    //员工列表操作
    public List<Menu> selectAll() {
        return menuMapper.selectAll();
    }

    /**
     * 根据员工的ID 查询菜单
     *
     * @return
     */
    public List<Menu> selectEmployeeMenu() {
        //获取所有的菜单
        List<Menu> menus = menuMapper.selectRootMenu();
        //获取当前的登陆用户
        Employee currentUser = UserContext.getUserContext();
        //判断是不是管理员
        if (!currentUser.getAdmin()) {
            //不是管理员 获取当前用户的拥有菜单ID集合
            List<Long> ids = menuMapper.selectByEmployeeId(currentUser.getId());
            checkPermission(menus, ids);
        }
        //是管理员 返回所有的菜单的权限
        return menus;
    }

    /**
     * 判断权限
     *
     * @param menus 菜单目录
     * @param ids   菜单ID集合
     */
    private void checkPermission(List<Menu> menus, List<Long> ids) {
        //迭代菜单 如果当前用户没有权限访问的菜单 直接从集合中移除掉
        Iterator<Menu> iterator = menus.iterator();
        //如果菜单有下一个元素 继续迭代
        while (iterator.hasNext()) {
            Menu menu = iterator.next();
            //判断菜单ID是否存在用户拥有的菜单中
            if (!ids.contains(menu.getId())) {
                //不存在 移除掉
                iterator.remove();
                //直接结束当前循环 执行下一次循环 提高效率
                continue;
            }
            //递归判断子菜单 判断当前的菜单是否有子菜单
            if (menu.getChildren().size() > 0) {
                //递归调用当前的方法 继续递归
                checkPermission(menu.getChildren(),ids);
            }
        }
    }

    @Override
    public List<Menu> selectByRoleId(Long roleId) {
        return menuMapper.selectByRoleId(roleId);
    }

    @Override
    public List<Menu> selectRootMenu() {
        return menuMapper.selectRootMenu();
    }
}
